package com.lysh.test.io;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author liyishan
 * @date 2023/5/5 14:36
 * @apiNote 扛不住高并发，来多少线程就要创建多少线程，分配过多内存，如果线程阻塞（例如：连接后不发送数据 SocketServer的情况）会消耗很多开销 --》解决：用线程池，但限制了线程数量，也限制了并发数量
 */

public class SocketServer2 {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9000);
        while(true){
            System.out.println("等待连接");
            //阻塞方法,等待客户端连接。   在此debug  然后cmd   telnet  localhost 9000
            Socket clientSocket = serverSocket.accept();
            System.out.println("有客户端连接了");
            //为了使该程序可以并发,主线程创建一个子线程做具体的处理
            new Thread(new Runnable(){
                @Override
                public void run(){
                    try{
                        handler(clientSocket);
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }).start();

        }
    }

    private static void handler(Socket clientSocket) throws IOException{
        byte[] bytes = new byte[1024];
        System.out.println("准备read。。。");
        //接收客户端的数据，阻塞方法，没有数据可读时阻塞
        int read = clientSocket.getInputStream().read(bytes);
        System.out.println("read完毕。。。");
        if(read != -1){
            System.out.println("接收到客户端的数据："+new String(bytes,0,read));
        }
    }
}
